package com.ruoyi.system.service.impl;

import cn.hutool.core.util.IdUtil;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.SecurityUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.system.domain.TrendData;
import com.ruoyi.system.domain.TrendType;
import com.ruoyi.system.mapper.TrendTypeMapper;
import com.ruoyi.system.service.ITrendTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 趋势图管理Service业务层处理
 *
 * @author cjie
 * @date 2022-11-30
 */
@Slf4j
@Service
public class TrendTypeServiceImpl implements ITrendTypeService {
    @Autowired
    private TrendTypeMapper trendTypeMapper;

    /**
     * 项目启动时，初始化字典到缓存
     */
/*    @PostConstruct
    public void init() {
        List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
        for (SysDictType dictType : dictTypeList) {
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
            DictUtils.setDictCache(dictType.getDictType(), dictDatas);
        }
    }*/

    /**
     * 查询趋势图管理
     *
     * @param trendId 趋势图管理ID
     * @return 趋势图管理
     */
    @Override
    public TrendType selectTrendTypeById(Long trendId) {
        return trendTypeMapper.selectTrendTypeById(trendId);
    }

    /**
     * 查询趋势图管理列表
     *
     * @param trendType 趋势图管理
     * @return 趋势图管理
     */
    @Override
    public List<TrendType> selectTrendTypeList(TrendType trendType) {
        return trendTypeMapper.selectTrendTypeList(trendType);
    }

    /**
     * 新增趋势图管理
     *
     * @param trendType 趋势图管理
     * @return 结果
     */
    @Transactional
    @Override
    public int insertTrendType(TrendType trendType) {
        //trendType.setId(IdUtil.getSnowflake(0, 0).nextIdStr());
        trendType.setCreateTime(DateUtils.getNowDate());
        trendType.setCreateBy(SecurityUtils.getUsername());
        int rows = trendTypeMapper.insertTrendType(trendType);
        insertTrendData(trendType);
        return rows;
    }

    /**
     * 修改趋势图管理
     *
     * @param trendType 趋势图管理
     * @return 结果
     */
    @Transactional
    @Override
    public int updateTrendType(TrendType trendType) {
        trendType.setUpdateTime(DateUtils.getNowDate());
        trendType.setUpdateBy(SecurityUtils.getUsername());
        //存在更新，不存在插入；
        //trendTypeMapper.deleteTrendDataByTrendType(trendType.getTrendType());
        insertUpdateTrendData(trendType);
        return trendTypeMapper.updateTrendType(trendType);
    }

    /**
     * 批量删除趋势图管理
     *
     * @param trendIds 需要删除的趋势图管理ID,软删除
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteTrendTypeByIds(Long[] trendIds) {
        trendTypeMapper.deleteTrendDataByTrendTypes(trendIds);
        return trendTypeMapper.deleteTrendTypeByIds(trendIds);
    }

    /**
     * 删除趋势图管理信息
     *
     * @param trendId 趋势图管理ID
     * @return 结果
     */
    @Override
    public int deleteTrendTypeById(Long trendId) {
        TrendType trendType = trendTypeMapper.selectTrendTypeById(trendId);
        trendTypeMapper.deleteTrendDataByTrendType(trendType.getTrendType());
        return trendTypeMapper.deleteTrendTypeById(trendId);
    }

    @Override
    public Map<String, String> selectTrendTypeDataByType(String type, Integer limit) {
        //查询类型，倒序
        List<TrendData> trendDataList = trendTypeMapper.selectTrendDataByType(type,limit);
        log.info("limit: " + limit);
        Map<String, String> result = new LinkedHashMap<>(trendDataList.size());
        //Map<String, String> result = trendDataList.stream().collect(Collectors.toMap(TrendData::getDataLabel,TrendData::getDataValue,(k1,k2)->k2, LinkedHashMap::new));
        for(int i = trendDataList.size()-1;i>=0;i--){
            result.put(trendDataList.get(i).getDataLabel(),trendDataList.get(i).getDataValue());
        }
        return result;
    }

    @Override
    public List<TrendData> selectTrendTypeData(String type) {
        return trendTypeMapper.selectTrendDataByType(type,-1);
    }

    @Override
    public int insertTrendTypeAndData(TrendType trendType) {
        int rows =0;
        TrendType trendType1 =  trendTypeMapper.selectTrendTypeByType(trendType.getTrendType());
        if(trendType1 == null){
            trendType.setCreateTime(DateUtils.getNowDate());
            trendType.setCreateBy(SecurityUtils.getUsername());
            rows = trendTypeMapper.insertTrendType(trendType);
        }
        //插入 or 更新 TrendData
        List<TrendData> trendDataList = trendType.getTrendDataList();
        String type = trendType.getTrendType();
        if (StringUtils.isNotNull(trendDataList)) {
            //if id 存在 更新 else insert
            List<TrendData> list = new ArrayList<TrendData>();
            for (TrendData trendData : trendDataList){
                trendData.setTrendType(type);
                if(StringUtils.isNotBlank(trendData.getDataCode())){
                    trendData.setTrendType(type);
                    trendData.setUpdateTime(DateUtils.getNowDate());
                    rows = rows + trendTypeMapper.updateTrendData(trendData);
                    continue;
                }
                trendData.setDataCode(IdUtil.getSnowflake(0, 0).nextIdStr());
                list.add(trendData);
            }
            if (list.size() > 0) {
                rows = rows + trendTypeMapper.batchTrendData(list);
            }
        }
        return rows;
    }

    @Override
    public int insertTrendData(TrendData trendData) {
        trendData.setDataCode(IdUtil.getSnowflake(0, 0).nextIdStr());
        trendData.setCreateTime(DateUtils.getNowDate());
        trendData.setUpdateTime(trendData.getCreateTime());
        trendData.setCreateBy(SecurityUtils.getUsername());
        return trendTypeMapper.insertTrendData(trendData);
    }

    @Override
    public List<TrendData> selectTrendDataList(TrendData trendData) {
        return trendTypeMapper.selectTrendDataList(trendData);
    }

    @Override
    public int updateTrendData(TrendData trendData) {
        return trendTypeMapper.updateTrendData(trendData);
    }

    @Override
    public TrendData selectTrendTypeDataByTypeAndKey(String trendType, String key) {
        return trendTypeMapper.selectTrendTypeDataByTypeAndKey(trendType,key);
    }

    @Override
    public List<Map<String, Object>> selectDataListBySql(String sqlStr) {
        return trendTypeMapper.selectDataList(sqlStr);
    }


    /**
     * 新增趋势图数据信息
     *
     * @param trendType 趋势图管理对象
     */
    public void insertTrendData(TrendType trendType) {
        List<TrendData> trendDataList = trendType.getTrendDataList();
        String type = trendType.getTrendType();
        if (StringUtils.isNotNull(trendDataList)) {
            List<TrendData> list = new ArrayList<TrendData>();
            for (TrendData trendData : trendDataList){
                trendData.setTrendType(type);
                trendData.setDataCode(IdUtil.getSnowflake(0, 0).nextIdStr());
                trendData.setCreateTime(DateUtils.getNowDate());
                trendData.setUpdateTime(DateUtils.getNowDate());
                list.add(trendData);
            }
            if (list.size() > 0) {
                trendTypeMapper.batchTrendData(list);
            }
        }
    }

    /**
     * 新增趋势图数据信息
     *
     * @param trendType 趋势图管理对象
     */
    public void insertUpdateTrendData(TrendType trendType) {
        List<TrendData> trendDataList = trendType.getTrendDataList();
        String type = trendType.getTrendType();
        if (StringUtils.isNotNull(trendDataList)) {
            List<TrendData> list = new ArrayList<TrendData>();
            for (TrendData trendData : trendDataList){
                if(StringUtils.isBlank(trendData.getDataCode())){
                    trendData.setTrendType(type);
                    trendData.setDataCode(IdUtil.getSnowflake(0, 0).nextIdStr());
                    trendData.setCreateTime(DateUtils.getNowDate());
                    trendData.setUpdateTime(trendData.getCreateTime());
                    list.add(trendData);
                }else {
                    //更新 TrendData
                    trendData.setTrendType(type);
                    trendData.setUpdateTime(DateUtils.getNowDate());
                    trendTypeMapper.updateTrendData(trendData);
                }

            }
            if (list.size() > 0) {
                trendTypeMapper.batchTrendData(list);
            }
        }
    }
}
